package com.redhat.ceylon.eclipse.code.refactor;
import org.eclipse.jdt.internal.ui.util.SWTUtil;
import org.eclipse.jface.layout.GridDataFactory;
import org.eclipse.jface.layout.GridLayoutFactory;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.CheckStateChangedEvent;
import org.eclipse.jface.viewers.CheckboxTableViewer;
import org.eclipse.jface.viewers.ICheckStateListener;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerComparator;
import org.eclipse.ltk.ui.refactoring.UserInputWizardPage;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Text;
import com.redhat.ceylon.model.typechecker.model.Declaration;
import com.redhat.ceylon.compiler.typechecker.tree.Tree;
import com.redhat.ceylon.eclipse.code.outline.CeylonLabelProvider;
public class ExtractInterfaceWizardPage extends UserInputWizardPage {
private ExtractInterfaceRefactoring refactoring;
private Tree.Declaration[] extractableMembers;
private Label interfaceNameLabel;
private Text interfaceNameText;
private Button btnSelectAll;
private Button btnDeselectAll;
private CheckboxTableViewer tableViewer;
public ExtractInterfaceWizardPage(ExtractInterfaceRefactoring refactoring) {
super(refactoring.getName());
this.refactoring = refactoring;
this.extractableMembers = refactoring.extractableMembers;
}
@Override
public void createControl(Composite parent) {
setPageComplete(false);
initializeDialogUnits(parent);
Composite page = new Composite(parent, SWT.NONE);
page.setLayout(new GridLayout(2, false));
setControl(page);
interfaceNameLabel = new Label(page, SWT.RIGHT);
interfaceNameLabel.setText("Interface name: ");
interfaceNameText = new Text(page, SWT.SINGLE | SWT.BORDER);
interfaceNameText.setLayoutData(new GridData(SWT.FILL, SWT.BEGINNING, true, false));
interfaceNameText.addModifyListener(new ModifyListener() {
@Override
public void modifyText(ModifyEvent event) {
update();
}
});
Label separator = new Label(page, SWT.NONE);
separator.setLayoutData(GridDataFactory.swtDefaults().span(2, 1).create());
Label tableLabel = new Label(page, SWT.NONE);
tableLabel.setText("Members to declare in the interface:");
tableLabel.setEnabled(extractableMembers.length > 0);
tableLabel.setLayoutData(GridDataFactory.swtDefaults().span(2, 1).create());
createExtractableMembersTable(page);
}
private void createExtractableMembersTable(Composite page) {
Composite composite = new Composite(page, SWT.NONE);
composite.setLayout(GridLayoutFactory.swtDefaults().numColumns(2).margins(0, 0).create());
composite.setLayoutData(GridDataFactory.swtDefaults().align(SWT.FILL, SWT.FILL).span(2, 1).hint(SWT.DEFAULT, convertHeightInCharsToPixels(12)).create());
tableViewer = CheckboxTableViewer.newCheckList(composite, SWT.BORDER | SWT.V_SCROLL | SWT.H_SCROLL);
tableViewer.getTable().setLayoutData(new GridData(GridData.FILL_BOTH));
tableViewer.setLabelProvider(new CeylonLabelProvider());
tableViewer.setContentProvider(new ArrayContentProvider());
tableViewer.setInput(extractableMembers);
tableViewer.getControl().setEnabled(extractableMembers.length > 0);
tableViewer.setComparator(new ViewerComparator() {
@Override
public int compare(Viewer viewer, Object e1, Object e2) {
Declaration d1 = ((Tree.Declaration) e1).getDeclarationModel();
Declaration d2 = ((Tree.Declaration) e2).getDeclarationModel();
return d1.getName().compareTo(d2.getName());
}
});
tableViewer.addCheckStateListener(new ICheckStateListener() {
@Override
public void checkStateChanged(CheckStateChangedEvent event) {
update();
}
});
createButtons(composite);
}
private void createButtons(Composite composite) {
Composite buttonComposite = new Composite(composite, SWT.NONE);
buttonComposite.setLayout(GridLayoutFactory.swtDefaults().margins(0, 0).create());
buttonComposite.setLayoutData(GridDataFactory.swtDefaults().align(SWT.BEGINNING, SWT.FILL).grab(false, true).create());
btnSelectAll = new Button(buttonComposite, SWT.PUSH);
btnSelectAll.setText("Select All");
btnSelectAll.setEnabled(extractableMembers.length > 0);
btnSelectAll.setLayoutData(new GridData());
btnSelectAll.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
tableViewer.setAllChecked(true);
update();
}
});
btnDeselectAll = new Button(buttonComposite, SWT.PUSH);
btnDeselectAll.setText("Deselect All");
btnDeselectAll.setEnabled(extractableMembers.length > 0);
btnDeselectAll.setLayoutData(new GridData());
btnDeselectAll.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
tableViewer.setAllChecked(false);
update();
}
});
SWTUtil.setButtonDimensionHint(btnSelectAll);
SWTUtil.setButtonDimensionHint(btnDeselectAll);
}
private void update() {
String interfaceName = interfaceNameText.getText();
Tree.TypedDeclaration[] checkedMembers = new Tree.TypedDeclaration[tableViewer.getCheckedElements().length];
for (int i = 0; i < tableViewer.getCheckedElements().length; i++) {
checkedMembers[i] = (Tree.TypedDeclaration) tableViewer.getCheckedElements()[i];
}
if (interfaceName.isEmpty()) {
setPageComplete(false);
return;
}
if (checkedMembers.length == 0) {
setPageComplete(false);
return;
}
setPageComplete(true);
refactoring.newInterfaceName = interfaceName;
refactoring.extractedMembers = checkedMembers;
}
}